package com.lgc.demo.example.prizedraw;

import java.util.*;

public class CalculateCard {
    /**
     * 抽卡
     *
     * @param whichDay             第几天
     * @param haveCardTypes        已有卡类型
     * @param haveCardHistoryCount 已有卡总数(包含曾经抽取过的和领取过的总数)
     * @return 卡类型
     */
    public int draw(int whichDay, Set<Integer> haveCardTypes, int haveCardHistoryCount) {
        if (whichDay == 1) {
            if (haveCardTypes.size() == 0) {
                return randomGetCardType(null);
            } else if (haveCardTypes.size() == 1) {
                if (haveCardHistoryCount >= 2) {
                    return randomGetCardType(haveCardTypes);
                } else {
                    return randomGetCardType(null);
                }
            } else if (haveCardTypes.size() == 2) {
                if (haveCardHistoryCount == 2) {
                    //要求必须有张重复的(第3张卡必须重复，否则没法分享)
                    return getRepeatCardType(haveCardTypes);
                } else if (haveCardHistoryCount == 4) {
                    //有过5张时必得3张不同的
                    return randomGetCardType(haveCardTypes);
                } else {
                    return randomGetCardType(null);
                }
            } else {
                return randomGetCardType(null);
            }
        } else if (whichDay == 2) {
            if (haveCardTypes.size() < 3) {
                return randomGetCardType(haveCardTypes);
            } else if (haveCardTypes.size() == 3) {
                if (haveCardTypes.size() == haveCardHistoryCount) {
                    //这张卡必须重复，否则没法分享
                    return getRepeatCardType(haveCardTypes);
                } else {
                    return randomGetCardType(haveCardTypes);
                }
            } else if (haveCardTypes.size() == 4) {
                if (haveCardHistoryCount < 6) {
                    //此时要求给重复卡，即前4种类型卡必有两张重复
                    return getRepeatCardType(haveCardTypes);
                } else if (haveCardHistoryCount >= 8) {
                    return randomGetCardType(haveCardTypes);
                } else {
                    return randomGetCardType(null);
                }
            } else if (haveCardTypes.size() == 5) {
                if (haveCardHistoryCount >= 9) {
                    return randomGetCardType(haveCardTypes);
                } else {
                    return randomGetCardType(null);
                }
            } else {
                return randomGetCardType(null);
            }

        } else {
            //第三天开始缺什么卡就抽出什么卡
            return randomGetCardType(haveCardTypes);
        }
    }

    /**
     * 随机得到卡类型
     *
     * @param exceptCardTypes 排队掉的卡类型
     * @return
     */
    private int randomGetCardType(Set<Integer> exceptCardTypes) {
        int cardType = 1;
        while (true) {
            //随机取个1-6的数
            Random ra = new Random();
            int randomType = ra.nextInt(6) + 1;

            if (exceptCardTypes == null || exceptCardTypes.size() == 6 || !exceptCardTypes.contains(randomType)) {
                cardType = randomType;
                break;
            }
        }

        return cardType;
    }

    /**
     * 得到一张重复卡
     *
     * @param haveCardTypes
     * @return
     */
    private int getRepeatCardType(Set<Integer> haveCardTypes) {
        int cardType = 1;
        if (haveCardTypes.size() == 0) {
            return cardType;
        }

        while (true) {
            //随机取个1-6的数
            Random ra = new Random();
            int randomType = ra.nextInt(6) + 1;

            if (haveCardTypes.contains(randomType)) {
                cardType = randomType;
                break;
            }
        }

        return cardType;
    }

    /**
     * 初始数据
     *
     * @param cardType 1-6
     * @return
     */
    public List<UserCard> getList(int cardType) {
        List<UserCard> result = new ArrayList<>();
        if (cardType == 1) {
            UserCard obj = new UserCard();
            obj.setCardNo("a111");
            obj.setIsShare((byte) 0);
            obj.setCreateTime("2018-04-30");

            result.add(obj);

            UserCard obj2 = new UserCard();
            obj2.setCardNo("a222");
            obj2.setIsShare((byte) 0);
            obj2.setCreateTime("2018-04-30");

            result.add(obj2);

            UserCard obj3 = new UserCard();
            obj3.setCardNo("a222");
            obj3.setIsShare((byte) 0);
            obj3.setCreateTime("2018-04-30");

            result.add(obj3);
        } else if (cardType == 2) {
            UserCard obj = new UserCard();
            obj.setCardNo("b111");
            obj.setIsShare((byte) 0);
            obj.setCreateTime("2018-05-01");

            result.add(obj);
        } else if (cardType == 3) {
            UserCard obj = new UserCard();
            obj.setCardNo("c111");
            obj.setIsShare((byte) 0);
            obj.setCreateTime("2018-04-30");

            result.add(obj);
        } else if (cardType == 4) {
            UserCard obj = new UserCard();
            obj.setCardNo("d111");
            obj.setIsShare((byte) 0);
            obj.setCreateTime("2018-04-30");

            result.add(obj);

            UserCard obj2 = new UserCard();
            obj2.setCardNo("d222");
            obj2.setIsShare((byte) 0);
            obj2.setCreateTime("2018-05-01");

            result.add(obj2);
        } else if (cardType == 5) {
            UserCard obj = new UserCard();
            obj.setCardNo("e111");
            obj.setIsShare((byte) 0);
            obj.setCreateTime("2018-05-01");

            result.add(obj);
        } else if (cardType == 6) {
            UserCard obj = new UserCard();
            obj.setCardNo("f111");
            obj.setIsShare((byte) 0);
            obj.setCreateTime("2018-05-01");

            result.add(obj);

            UserCard obj2 = new UserCard();
            obj2.setCardNo("f222");
            obj2.setIsShare((byte) 0);
            obj2.setCreateTime("2018-05-01");

            result.add(obj2);
        }

        return result;
    }
}
